export default class DateUtil {
  /**
   * 获取当前日期 YYYY-MM-DD
   * @returns {string} 格式化后的日期字符串
   */
  static getToday(): string {
    return this.formatDate(new Date());
  }

  static getNowTime(): string {
    return this.formatDateTime(new Date());
  }

  /**
   * 将 Date 或 时间字符串格式化为 YYYY-MM-DD
   * @param date 日期对象 或 时间字符串
   * @returns {string} 格式化后的日期字符串
   */
  static formatDate(date: Date | string): string {
    const d = typeof date === "string" ? new Date(date) : date;
    if (isNaN(d.getTime())) {
      throw new Error("Invalid date format");
    }
    return `${d.getFullYear()}-${this.padZero(d.getMonth() + 1)}-${this.padZero(d.getDate())}`;
  }

  /**
   * 将 Date 或 时间字符串格式化为 YYYY-MM-DD
   * @param date 日期对象 或 时间字符串
   * @returns {string} 格式化后的日期字符串，日期格式错误返回 空字符串
   */
  static formatDateNotException(date: Date | string): string {
    const d = typeof date === "string" ? new Date(date) : date;
    if (isNaN(d.getTime())) {
      return ''
    }
    return `${d.getFullYear()}-${this.padZero(d.getMonth() + 1)}-${this.padZero(d.getDate())}`;
  }

  /**
   * 将 Date 或 时间字符串格式化为 YYYY-MM-DD HH:mm:ss
   * @param date 日期对象 或 时间字符串
   * @returns {string} 格式化后的日期字符串
   */
  static formatDateTime(date: Date | string): string {
    const d = typeof date === "string" ? new Date(date) : date;
    if (isNaN(d.getTime())) {
      throw new Error("Invalid date format");
    }
    return `${d.getFullYear()}-${this.padZero(d.getMonth() + 1)}-${this.padZero(d.getDate())} ${this.padZero(d.getHours())}:${this.padZero(d.getMinutes())}:${this.padZero(d.getSeconds())}`;
  }

  /**
   * 获取指定日期的时间戳
   * @param date 日期对象 或 时间字符串
   * @returns {number} 时间戳（毫秒）
   */
  static getTimestamp(date: Date | string): number {
    return new Date(date).getTime();
  }

  /**
   * 计算两个日期的天数差
   * @param startDate 开始日期
   * @param endDate 结束日期
   * @returns {number} 天数差
   */
  static dateDiff(startDate: string | Date, endDate: string | Date): number {
    const start = new Date(startDate).getTime();
    const end = new Date(endDate).getTime();
    return Math.ceil((end - start) / (1000 * 60 * 60 * 24)); // 毫秒转天数
  }

  /**
   * 判断是否是闰年
   * @param year 年份（可选，默认当前年）
   * @returns {boolean} 是否是闰年
   */
  static isLeapYear(year: number = new Date().getFullYear()): boolean {
    return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
  }

  /**
   * 获取指定月份的天数
   * @param year 年份
   * @param month 月份（1-12）
   * @returns {number} 该月的天数
   */
  static getDaysInMonth(year: number, month: number): number {
    return new Date(year, month, 0).getDate();
  }

  /**
   * 补零方法（确保数字是两位数）
   * @param num 数字
   * @returns {string} 补零后的字符串
   */
  private static padZero(num: number): string {
    return num < 10 ? `0${num}` : `${num}`;
  }
}

